{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.  1.1]\n",
      " [1.  1. ]\n",
      " [0.  0. ]\n",
      " [0.  0.1]]\n",
      "['A', 'A', 'B', 'B']\n"
     ]
    }
   ],
   "source": [
    "from numpy import * \n",
    "import operator\n",
    "\n",
    "def createDataSet():\n",
    "    group = array([[1.0,1.1],[1,1],[0,0],[0,0.1]])\n",
    "    labels = ['A', 'A', 'B', 'B']\n",
    "    return group, labels \n",
    "group, labels = createDataSet()\n",
    "print(group)\n",
    "print(labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K-邻近算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def classify0(inX, dataSet, labels, k):\n",
    "    dataSetSize = dataSet.shape[0]\n",
    "    diffMat = tile(inX, (dataSetSize, 1)) - dataSet\n",
    "    sqDiffMat = diffMat ** 2 \n",
    "    sqDistance = sqDiffMat.sum(axis=1)\n",
    "    distance = sqDistance ** 0.5 \n",
    "#     print(distance)\n",
    "    sortedDistIndices = distance.argsort()\n",
    "#     print(sortedDistIndices)\n",
    "    classCount = {}\n",
    "    for i in range(k):\n",
    "        voteIlabel = labels[sortedDistIndices[i]]\n",
    "        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1\n",
    "#     print(classCount)\n",
    "    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)\n",
    "#     print(sortedClassCount)\n",
    "    return sortedClassCount[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'B'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "classify0([0,0], group, labels, 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 示例一 约会对象是否喜欢预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取数据 \n",
    "def file2matrix(filename):\n",
    "    file = open(filename)\n",
    "    lines = file.readlines()\n",
    "    num_lines = len(lines)\n",
    "    returnMat = zeros((num_lines, 3))\n",
    "    \n",
    "    classLabelVector = []\n",
    "    index = 0 \n",
    "    for line in lines:\n",
    "        line = line.strip()\n",
    "        listFromLine = line.split('\\t')\n",
    "#         print(listFromLine)\n",
    "        returnMat[index, :] = listFromLine[0:3]\n",
    "        classLabelVector.append(int(listFromLine[-1]))\n",
    "        index += 1 \n",
    "    return returnMat, classLabelVector "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4.0920000e+04 8.3269760e+00 9.5395200e-01]\n",
      " [1.4488000e+04 7.1534690e+00 1.6739040e+00]\n",
      " [2.6052000e+04 1.4418710e+00 8.0512400e-01]\n",
      " ...\n",
      " [2.6575000e+04 1.0650102e+01 8.6662700e-01]\n",
      " [4.8111000e+04 9.1345280e+00 7.2804500e-01]\n",
      " [4.3757000e+04 7.8826010e+00 1.3324460e+00]]\n"
     ]
    }
   ],
   "source": [
    "datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')\n",
    "print(datingDataMat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]\n"
     ]
    }
   ],
   "source": [
    "print(datingLabels[:20])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分析数据，用matplotlib 创建散点图\n",
    "import matplotlib \n",
    "import matplotlib.pyplot as plt\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(1,1,1)\n",
    "# ax.scatter(datingDataMat[:,1], datingDataMat[:,2])\n",
    "# ax.scatter(datingDataMat[:, 1], datingDataMat[:, 2], 15*array(datingLabels), array(datingLabels))\n",
    "ax.scatter(datingDataMat[:,0], datingDataMat[:,1], 15*array(datingLabels), array(datingLabels))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "ax1 = fig.add_subplot(1,2,2)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 特征缩放\n",
    "def autoNorm(dataSet):\n",
    "    minVals = dataSet.min(0)\n",
    "    maxVals = dataSet.max(0)\n",
    "    ranges = maxVals - minVals \n",
    "    normDataSet = zeros(shape(dataSet))\n",
    "    m = dataSet.shape[0]\n",
    "    normDataSet = dataSet - tile(minVals, (m, 1))\n",
    "    normDataSet = normDataSet / tile(ranges, (m, 1))\n",
    "    return normDataSet, ranges, minVals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.44832535 0.39805139 0.56233353]\n",
      " [0.15873259 0.34195467 0.98724416]\n",
      " [0.28542943 0.06892523 0.47449629]\n",
      " ...\n",
      " [0.29115949 0.50910294 0.51079493]\n",
      " [0.52711097 0.43665451 0.4290048 ]\n",
      " [0.47940793 0.3768091  0.78571804]]\n",
      "[9.1273000e+04 2.0919349e+01 1.6943610e+00]\n",
      "[0.       0.       0.001156]\n"
     ]
    }
   ],
   "source": [
    "normMat, ranges, minVals = autoNorm(datingDataMat)\n",
    "print(normMat)\n",
    "print(ranges)\n",
    "print(minVals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分类器实现\n",
    "def datingClassTest():\n",
    "    hoRatio = 0.10\n",
    "    datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')\n",
    "    normMat, ranges, minVals = autoNorm(datingDataMat)\n",
    "    m = normMat.shape[0]\n",
    "    numTestVecs = int(m*hoRatio)\n",
    "    errorCount = 0.0\n",
    "    for i in range(numTestVecs):\n",
    "        classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)\n",
    "#         print('Predict：', classifierResult, 'Answer:', datingLabels[i])\n",
    "        if classifierResult != datingLabels[i]: errorCount += 1\n",
    "    print('Error rate:', errorCount/numTestVecs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Error rate: 0.05\n"
     ]
    }
   ],
   "source": [
    "datingClassTest()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 示例：手写识别系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将图像转换位向量 (将32*32的二进制图像矩阵转换为1*1024的向量)\n",
    "def img2vector(filename):\n",
    "    returnVect = zeros((1, 1024))\n",
    "    file = open(filename)\n",
    "    for i in range(32):\n",
    "        lineStr = file.readline()\n",
    "        for j in range(32):\n",
    "            returnVect[0, 32*i+j] = int(lineStr[j])\n",
    "    return returnVect"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "img2vector('trainingDigits/0_0.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 使用k-NN算法识别手写数字  \n",
    "import os\n",
    "\n",
    "def handwritingClassTest():\n",
    "    hwLabels = []\n",
    "    trainingFileList = os.listdir('trainingDigits')\n",
    "    m = len(trainingFileList)\n",
    "    trainingMat = zeros((m, 1024))\n",
    "    for i in range(m):\n",
    "        fileNameStr = trainingFileList[i]\n",
    "        fileStr = fileNameStr.split('.')[0]\n",
    "        classNumStr = int(fileStr.split('_')[0])\n",
    "        hwLabels.append(classNumStr)\n",
    "        trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)\n",
    "    testFileList = os.listdir('testDigits')\n",
    "    errorCount= 0\n",
    "    mTest = len(testFileList)\n",
    "    for i in range(mTest):\n",
    "        fileNameStr = testFileList[i]\n",
    "        fileStr = fileNameStr.split('.')[0]\n",
    "        classNumStr = int(fileStr.split('_')[0])\n",
    "        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)\n",
    "        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)]\n",
    "        print(classifierResult, classNumStr)\n",
    "        if classifierResult != classNumStr: errorCount += 1\n",
    "    print('Error rate:', errorCount / mTest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "0 0\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "7 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "1 1\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "2 2\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "9 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "3 3\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "4 4\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "3 5\n",
      "6 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "5 5\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "6 6\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "7 7\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "6 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "3 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "1 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "1 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "8 8\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "1 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "7 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "9 9\n",
      "Error rate: 0.010570824524312896\n"
     ]
    }
   ],
   "source": [
    "handwritingClassTest()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ============================================================="
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "def classify(inX, dataSet, labels, k):\n",
    "    dataSetSize = dataSet.shape[0]\n",
    "#     print(dataSetSize)\n",
    "    inMat = tile(inX, (dataSetSize, 1))\n",
    "#     print(inMat)\n",
    "    diffMat = (dataSet - inMat) ** 2\n",
    "#     print(diffMat)\n",
    "    distance = diffMat.sum(axis=1) ** 0.5 \n",
    "#     print(distance)\n",
    "    sortedDistance = distance.argsort()\n",
    "#     print(sortedDistance)\n",
    "    \n",
    "    classCount = {}\n",
    "    for i in range(k):\n",
    "        label = labels[sortedDistance[i]]\n",
    "        classCount[label] = classCount.get(label, 0) + 1\n",
    "    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)\n",
    "#     print(sortedClassCount)\n",
    "    return sortedClassCount[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'A'"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inX = [2,2]\n",
    "dataSet = array([[1,1],[1,1.1],[0,0],[0,0.1]])\n",
    "labels = ['A', 'A', 'B', 'B']\n",
    "k = 3\n",
    "classify(inX, dataSet, labels, k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 示例一"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [],
   "source": [
    "def file2matrix(filename):\n",
    "    with open(filename) as file:\n",
    "        f = file.readlines()\n",
    "#     print(f[:5])\n",
    "#     print(len(f))\n",
    "    lineCount = len(f)\n",
    "    returnMat = zeros((lineCount, 3))\n",
    "\n",
    "    labelVectors = []\n",
    "    index = 0 \n",
    "    for line in f:\n",
    "        line = line.strip()\n",
    "        piece_line = line.split('\\t')\n",
    "        returnMat[index, :] = piece_line[:3]\n",
    "        labelVectors.append(piece_line[-1])\n",
    "        index += 1\n",
    "    return returnMat, labelVectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[4.0920000e+04, 8.3269760e+00, 9.5395200e-01],\n",
       "        [1.4488000e+04, 7.1534690e+00, 1.6739040e+00],\n",
       "        [2.6052000e+04, 1.4418710e+00, 8.0512400e-01],\n",
       "        ...,\n",
       "        [2.6575000e+04, 1.0650102e+01, 8.6662700e-01],\n",
       "        [4.8111000e+04, 9.1345280e+00, 7.2804500e-01],\n",
       "        [4.3757000e+04, 7.8826010e+00, 1.3324460e+00]]),\n",
       " ['3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '1',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '3',\n",
       "  '3',\n",
       "  '1',\n",
       "  '2',\n",
       "  '1',\n",
       "  '2',\n",
       "  '3',\n",
       "  '1',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '3',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '2',\n",
       "  '1',\n",
       "  '3',\n",
       "  '3',\n",
       "  '3'])"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "file2matrix('datingTestSet2.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [],
   "source": [
    "def autoNorm(dataSet):\n",
    "    minVals = dataSet.min(0)\n",
    "    maxVals = dataSet.max(0)\n",
    "    ranges = maxVals - minVals \n",
    "    normDataSet = zeros(shape(dataSet))\n",
    "    m = dataSet.shape[0]\n",
    "    normDataSet = dataSet - tile(minVals, (m, 1))\n",
    "    normDataSet = normDataSet / tile(ranges, (m, 1))\n",
    "    return normDataSet, ranges, minVals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0.44832535, 0.39805139, 0.56233353],\n",
       "        [0.15873259, 0.34195467, 0.98724416],\n",
       "        [0.28542943, 0.06892523, 0.47449629],\n",
       "        ...,\n",
       "        [0.29115949, 0.50910294, 0.51079493],\n",
       "        [0.52711097, 0.43665451, 0.4290048 ],\n",
       "        [0.47940793, 0.3768091 , 0.78571804]]),\n",
       " array([9.1273000e+04, 2.0919349e+01, 1.6943610e+00]),\n",
       " array([0.      , 0.      , 0.001156]))"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "autoNorm(returnMat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [],
   "source": [
    "def datingClassTest():\n",
    "    hoRatio = 0.1 \n",
    "    datingDataMat, datingLabels = file2matrix('datingTestSet.txt')\n",
    "    normMat, ranges, minVals = autoNorm(datingDataMat)\n",
    "    m = normMat.shape[0]\n",
    "    numTestVecs = int(m*hoRatio)\n",
    "#     print(numTestVecs)\n",
    "    errorCount = 0 \n",
    "    \n",
    "    for i in range(numTestVecs):\n",
    "        classifierResult = classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m],3)\n",
    "        print(classifierResult, datingLabels[i])\n",
    "        if classifierResult != datingLabels[i]: errorCount += 1\n",
    "    print('Error rate:', errorCount / float(numTestVecs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "largeDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "largeDoses largeDoses\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "largeDoses didntLike\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "largeDoses largeDoses\n",
      "largeDoses didntLike\n",
      "largeDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "smallDoses largeDoses\n",
      "didntLike didntLike\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "largeDoses largeDoses\n",
      "largeDoses largeDoses\n",
      "smallDoses smallDoses\n",
      "didntLike didntLike\n",
      "largeDoses didntLike\n",
      "Error rate: 0.05\n"
     ]
    }
   ],
   "source": [
    "datingClassTest()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
